package z_mxsTest.testArxml;

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class testArxmlParse {

    private Document document;

    /**
     * 初始化并加载 ARXML 文件。
     * @param filePath ARXML 文件路径
     * @throws Exception 如果文件加载失败或解析出错
     */
    public testArxmlParse(String filePath) throws Exception {
        try {
            // 创建 DocumentBuilder
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true); // 启用命名空间支持
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 解析 ARXML 文件
            document = builder.parse(new File(filePath));
        } catch (Exception e) {
            throw new Exception("加载 ARXML 文件时出错: " + e.getMessage(), e);
        }
    }

    /**
     * 获取指定节点的一层子节点。
     * @param node 指定的节点，默认为根节点
     * @return 子节点列表
     */
    public List<Node> getDirectChildren(Node node) {
        if (node == null) {
            node = document.getDocumentElement(); // 默认从根节点开始
        }

        List<Node> children = new ArrayList<>();
        NodeList childNodes = node.getChildNodes();
        for (int i = 0; i < childNodes.getLength(); i++) {
            Node child = childNodes.item(i);
            if (child.getNodeType() == Node.ELEMENT_NODE) { // 只处理元素节点
                children.add(child);
            }
        }
        return children;
    }

    /**
     * 根据标签名称查找节点（仅在一层内查找）。
     * @param tagName 要查找的标签名称
     * @param parent 父节点，默认为根节点
     * @return 找到的节点或 null
     */
    public Node findNodeByTag(String tagName, Node parent) {
        if (parent == null) {
            parent = document.getDocumentElement(); // 默认从根节点开始
        }

        NodeList childNodes = parent.getChildNodes();
        for (int i = 0; i < childNodes.getLength(); i++) {
            Node child = childNodes.item(i);
            if (child.getNodeType() == Node.ELEMENT_NODE && matchesTagName(child, tagName)) {
                return child;
            }
        }
        return null;
    }

    /**
     * 匹配节点标签名称，处理命名空间问题。
     * @param node 节点
     * @param tagName 标签名称
     * @return 是否匹配
     */
    private boolean matchesTagName(Node node, String tagName) {
        String nodeName = node.getNodeName();
        int colonIndex = nodeName.indexOf(':'); // 处理命名空间前缀
        if (colonIndex != -1) {
            nodeName = nodeName.substring(colonIndex + 1); // 去掉命名空间前缀
        }
        return nodeName.equals(tagName);
    }

    public static void main(String[] args) {
        try {
            // 输出当前工作目录
            System.out.println("当前工作目录: " + System.getProperty("user.dir"));

            // 加载 ARXML 文件
            String arxmlFile = "D:/000000000.test/mxs.arxml"; // 请根据实际情况修改路径
            File file = new File(arxmlFile);

            if (!file.exists()) {
                System.err.println("文件不存在: " + file.getAbsolutePath());
                return;
            }

            testArxmlParse parser = new testArxmlParse(file.getAbsolutePath());

            // 获取根节点的一层子节点
            List<Node> rootChildren = parser.getDirectChildren(null);
            System.out.println("根节点的一层子节点:");
            for (Node child : rootChildren) {
                System.out.println(child.getNodeName());

                // 获取第二层子节点
                List<Node> secondLevelChildren = parser.getDirectChildren(child);
                System.out.println("  第二层子节点:");
                for (Node secondChild : secondLevelChildren) {
                    System.out.println("  " + secondChild.getNodeName());

                    // 获取第三层子节点
                    List<Node> thirdLevelChildren = parser.getDirectChildren(secondChild);
                    System.out.println("    第三层子节点:");
                    for (Node thirdChild : thirdLevelChildren) {
                        System.out.println("    " + thirdChild.getNodeName());
                    }
                }
            }
        } catch (Exception e) {
            System.err.println("发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    }


}

